import axios from "axios";
import { Loading, Message } from "element-ui";
import { saveAs } from "file-saver";
import { getToken } from "@/utils/auth";
import errorCode from "@/utils/errorCode";
import { blobValidate } from "@/utils/ruoyi";

const baseURL = process.env.VUE_APP_BASE_API;

export default {
  /**
   * 通用下载方法（支持GET/POST）
   * @param {string} url - 请求URL
   * @param {string} [name] - 保存文件名（可选，优先从响应头获取）
   * @param {string} [method="get"] - 请求方法
   * @param {object} [params] - 请求参数
   * @param {object} [options] - 额外配置
   */
  async download(url, name = "", method = "get", params = {}, options = {}) {
    try {
      // 合并默认配置
      const { 
        loadingText = "正在下载数据，请稍候",
        headers = {},
        responseType = "blob"
      } = options;
      
      // 构建完整URL
      const fullUrl = baseURL + url;
      
      // 显示加载提示
      const loadingInstance = Loading.service({
        text: loadingText,
        spinner: "el-icon-loading",
        background: "rgba(0, 0, 0, 0.7)"
      });
      
      // 通用请求配置
      const config = {
        method,
        url: fullUrl,
        responseType,
        headers: {
          ...headers,
          Authorization: `Bearer ${getToken()}`
        }
      };
      
      // 根据请求方法处理参数
      if (method.toLowerCase() === "get") {
        config.params = params;
      } else {
        config.data = params;
      }
      
      // 发送请求
      const res = await axios(config);
      
      // 验证响应是否为Blob
      const isBlob = await blobValidate(res.data);
      
      if (isBlob) {
        // 处理文件下载
        const contentType = res.headers['content-type'] || 'application/octet-stream';
        const blob = new Blob([res.data], { type: contentType });
        
        // 从响应头获取文件名（优先级高于传入的name参数）
        const contentDisposition = res.headers['content-disposition'] || res.headers['download-filename'];
        const suggestedName = this._extractFilename(contentDisposition) || name;
        
        this.saveAs(blob, suggestedName);
      } else {
        // 处理错误响应
        await this.printErrMsg(res.data);
        throw new Error("下载失败：非文件响应");
      }
    } catch (error) {
      console.error("下载错误:", error);
      Message.error("下载文件出现错误，请联系管理员！");
    } finally {
      // 关闭加载提示
      Loading.service().close();
    }
  },
  
  /**
   * 通过文件名下载（原name方法）
   */
  async downloadByName(fileName, isDelete = true) {
    return this.download(
      `/common/download?fileName=${encodeURIComponent(fileName)}&delete=${isDelete}`
    );
  },
  
  /**
   * 通过资源路径下载（原resource方法）
   */
  async downloadByResource(resourcePath) {
    return this.download(
      `/common/download/resource?resource=${encodeURIComponent(resourcePath)}`
    );
  },
  
  /**
   * 下载ZIP文件（原zip方法）
   */
  async downloadZip(url, name, method = "get", params = {}) {
    return this.download(url, name, method, params, {
      loadingText: "正在下载压缩文件，请稍候",
      headers: { 'Content-Type': 'application/json' }
    });
  },
  
  /**
   * 保存文件
   */
  saveAs(content, fileName, options) {
    saveAs(content, fileName, options);
  },
  
  /**
   * 打印错误信息
   */
  async printErrMsg(data) {
    try {
      const text = await data.text();
      const result = JSON.parse(text);
      const errMsg = errorCode[result.code] || result.msg || errorCode["default"];
      Message.error(errMsg);
    } catch (e) {
      Message.error("解析错误信息失败");
    }
  },
  
  /**
   * 从Content-Disposition头提取文件名
   */
  _extractFilename(header) {
    if (!header) return null;
    
    // 尝试从Content-Disposition中提取文件名
    const matches = header.match(/filename\*?=['"]?(?:UTF-\d['"]*)?([^;\r\n"']*)['"]?;?/i);
    if (matches && matches[1]) {
      return decodeURIComponent(matches[1].trim());
    }
    
    // 回退方案：从URL提取
    return null;
  }
};